<template>
  <div>
    <ul>
      <li v-for="(value, key) in person" :key="key">{{ key }} - {{ value }}</li>
    </ul>
    <ul>
      <li v-for="(person, index) in persons" :key="index">
        {{ index }} - {{ person.name }}
      </li>
    </ul>
    <button @click="update1">update1</button>
    <button @click="update2">update2</button>
  </div>
</template>

<script>
/*
  结论：
    1. 响应式：更新数据，数据变，同时用户界面也变
    2. data中原有数据都是响应式的，新添加的不是
      如果希望是，需要使用$set方法设置
        this.$set / Vue.set
    3. 数组可以通过变更方法来更新数据，达到响应式
*/
export default {
  name: "App",
  data() {
    return {
      person: {
        name: "jack",
        age: 18,
      },
      persons: [
        {
          name: "jack",
        },
        { name: "rose" },
      ],
    };
  },
  methods: {
    update1() {
      // 响应式：更新数据，数据变，同时用户界面也变
      // this.person.age++; // OK
      // 新添加的属性不是响应式的
      // this.person.sex = "男"; // 不OK
      // 添加响应式数据的方法
      this.$set(this.person, "sex", "男"); // OK
    },
    update2() {
      // 这是Vue的变更方法，实现了响应式
      this.persons.push({ name: "雷哥" }); // OK
      // 新添加的属性不是响应式的
      this.persons[this.persons.length] = { name: "雷哥" }; // 不OK
    },
  },
};
</script>

<style></style>
